      SUBROUTINE MIXMOD(NGLOBF) 
C! Checks for Mixed Mode expressions
      include 'PARAM.h' 
      include 'ALCAZA.h' 
      include 'CLASS.h' 
      include 'CURSTA.h' 
      include 'FLWORK.h' 
      include 'KEYCOM.h' 
      include 'TYPDEF.h' 
      include 'JOBSUM.h' 
      include 'STATE.h' 
      include 'FLAGS.h' 
      include 'USIGNO.h' 
      include 'USLIST.h' 
      include 'USGCOM.h' 
      include 'USSTMT.h' 
      include 'USUNIT.h' 
      include 'USARGS.h' 
      include 'USLTYD.h' 
      include 'STACK.h' 
      CHARACTER*1 STYP  
      CHARACTER*(LOPER) SOPT
      INTEGER ISTART(2),IFINIS(2)   
      CHARACTER*6 CREL(11)  
      CHARACTER*256 STEMP   
      INTEGER LPS(256)  
      INTEGER LREL(11)  
      DATA CREL /'.EQV. ','.NEQV.','.OR.  ','.AND. ','.NOT. ',  
     &           '.GT.  ','.GE.  ','.LT.  ','.LE.  ','.EQ.  ',  
     &           '.NE.  '/  
      DATA LREL /5,6,4,5,5,4,4,4,4,4,4/ 
C   
C CALLED FROM URTERM FOR EACH STATEMENT IN THE MODULE   
C   
      ICL1 = ICURCL(1)  
      ICL2 = ICURCL(2)  
C   
C RETURN UNLESS AN ASSIGNMENT STATEMENT 
C   
      IF(LIFF(ICL1)) THEN   
        IF(.NOT.LASIGN(ICL2)) RETURN
        IUP = 2 
C find end of IF
        JPT = INDEX(SSTA(:NCHST),'(')   
        CALL SKIPLV(SSTA,JPT+1,NCHST,.FALSE.,KND,ILEV)  
        ISTART(1) = JPT+1   
        ISTART(2) = KND+1   
        IFINIS(1) = KND-1   
        IFINIS(2) = NCHST   
      ELSE IF(LASIGN(ICL1)) THEN
        IUP = 1 
        KND = NCHST 
        ISTART(1) = 1   
        IFINIS(1) = NCHST   
      ELSE  
        RETURN  
      ENDIF 
C loop over parts of the statement  
      DO 20 IPART=1,IUP 
C zero stack address
        NLEVL = 0   
        IF(IPART.EQ.1) THEN 
          ICL=ICL1  
        ELSE
          ICL=ICL2  
          IF(.NOT.LASIGN(ICL))                                   GOTO 20
        ENDIF   
C KST and KND mark the start and end of the assignment part of the statement
        KST = ISTART(IPART) 
        KND = IFINIS(IPART) 
C       WRITE(6,'(A,A)') ' Statement : ',SSTA(KST:KND)  
C this part of statement is an assignment or is inside IF clause
C move from left to right, character by character   
        NLO1 = 1
        ICHR = KST  
    5   CONTINUE
        IF(ICHR.EQ.KND+1) THEN  
C put end of expression operator
          CALL PUTOPT('END',3,ICHR,IERR)
          IF(IERR.GT.0)                                          GOTO 25
          IF(IERR.LT.0) THEN
            NGLOBF = NGLOBF + 1 
                                                                 GOTO 40
          ENDIF 
                                                                 GOTO 20
        ENDIF   
        IF(SSTA(ICHR:ICHR).EQ.' ') THEN 
C ignore blanks 
          ICHR = ICHR + 1   
                                                                  GOTO 5
        ENDIF   
C NLO is the index to the statement name last found 
        NLO = NLO1  
        ICHRE = 0   
C find if this character is start of a name 
        DO 10 ISN=NLO,NSNAME
          IF(NSSTRT(ISN).NE.ICHR)                                GOTO 10
          NLO1 = ISN + 1
          ICHRE = NSEND(ISN)
C convert the name type to the smaller subset   
          CALL TY2TYP(ISN,STYP) 
C add this operand to the stack 
          CALL PUTOPA(SNAMES(ISN+ISNAME),STYP,ICHR,ICHRE,IERR)  
          IF(IERR.NE.0)                                          GOTO 30
          ICHR = ICHRE + 1  
C go for the next character after this name 
                                                                  GOTO 5
   10   CONTINUE
C next name is at NLO1  
        IF(NLO1.GT.NSNAME) THEN 
          IFIN = KND
        ELSE
          IFIN = NSSTRT(NLO1)-1 
        ENDIF   
        ISTA = ICHR 
C analyse this part of statement (ISTA:IFIN) since it is
C not a name, may be an operator
        ILEN = IFIN-ISTA+1  
        CALL GETOPT(SSTA(ISTA:IFIN),ILEN,SOPT,LOPT,IERR)
        IF(IERR.NE.0)                                            GOTO 15
C found an operator of length LOPT, called SOPT 
C put the operator on the stack 
        CALL PUTOPT(SOPT,LOPT,ICHR,IERR)
        IF(IERR.GT.0)                                            GOTO 15
        IF(IERR.LT.0) THEN  
          NGLOBF = NGLOBF + 1   
        ENDIF   
        ICHR = ICHR + LOPT  
                                                                  GOTO 5
   15   CONTINUE
C not a name, not an operator, so   
C check if start of a constant. Remove blanks first 
   98   NC=0
        DO 97 IC=ISTA,IFIN  
          IF(SSTA(IC:IC).EQ.' ') GOTO 97
          NC=NC+1   
          LPS(NC)=IC-ISTA   
          STEMP(NC:NC) = SSTA(IC:IC)
   97   CONTINUE
C remove .EQ. etc which confuse GETCON  
        DO 95 IREL=1,11 
          LP=INDEX(STEMP(:NC),CREL(IREL)(:LREL(IREL)))  
          IF(LP.EQ.0) GOTO 95   
          IFIN = ISTA + LPS(LP) - 1 
          GOTO 98   
   95   CONTINUE
        CALL GETCON(SSTA,ISTA,IFIN,KLCH,STYP)   
        IF(KLCH.NE.0) THEN  
C found a constant. place on the stack  
          CALL PUTOPA(SSTA(ISTA:KLCH),STYP,ICHR,KLCH,IERR)  
          IF(IERR.NE.0)                                          GOTO 35
          ICHR = KLCH + 1   
                                                                  GOTO 5
        ENDIF   
C not a name,operand or constant. this is an error. type the offender   
        LCST = MIN(70,NCHST)
        WRITE(MZUNIT,500) SSTA(1:LCST)  
   20 CONTINUE  
                                                                 GOTO 40
   25 CONTINUE  
   30 CONTINUE  
   35 CONTINUE  
   40 CONTINUE  
      RETURN
  500 FORMAT(1X,'!!! NON-FATAL ERROR IN MIXMOD ...',
     +' UNABLE TO PARSE: ',A)   
      END   
